home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Workbench Design
/
WB Collection.iso
/
workbench werkzeuge
/
memory & system tools
/
tinymeter
/
source
/
tinymeter_main
/
gaugeclass.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-04-07
|
32KB
|
857 lines
/*
** gaugeclass V0.9 by Tinic Urou
**
** Class implementation
**
** tested compilers:
**
** · DCC 2.6.2
** · GCC 2.7.0 with libnix V1.0 (libnix is necessary!!)
**
*/
#include <exec/types.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <dos/dosextens.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <intuition/intuitionbase.h>
#include <intuition/classusr.h>
#include <intuition/imageclass.h>
#include <intuition/gadgetclass.h>
#include <intuition/cghooks.h>
#include <intuition/icclass.h>
#include <intuition/classes.h>
#include <intuition/sghooks.h>
#include <intuition/screens.h>
#include <graphics/gfxbase.h>
#include <graphics/text.h>
#include <graphics/gfxmacros.h>
#include <utility/tagitem.h>
#include <utility/hooks.h>
#include <string.h>
#include "gaugeclass.h"
#define col_label 0
#define col_format 1
#define col_base 2
#define col_current 3
#define col_negative 4
#define col_bright 5
#define col_dark 6
#define col_bg 7
#define ind_centered 0
#define ind_left 1
#define ind_right 2
struct GaugeData
{
ULONG min;
ULONG max;
ULONG current;
ULONG base;
ULONG old_cur;
ULONG old_bas;
WORD labelpos;
UBYTE fmtind;
ULONG type;
char *txtlbl;
char *txtfmt;
struct GAU_Color Colors[GAU_UsedColors];
BOOL Style3D;
BOOL StyleBorder;
BOOL StyleBackground;
BOOL StyleShadowLabel;
BOOL StyleNoGauge;
BOOL StyleNoFormat;
BOOL StyleNoBase;
struct TextFont *textFont;
ULONG Pens[GAU_UsedColors];
BOOL PorC[GAU_UsedColors];
BOOL InitNotDone;
struct RastPort *nolock_rp;
LONG histpos;
WORD text_y;
struct Locale *locale;
char clocktxt[256];
struct RastPort *bg_buffer;
struct RastPort *wk_buffer;
struct RastPort *hs_buffer;
WORD clockpos;
};
extern ULONG DoSuperMethodA( struct IClass *cl, Object *obj, Msg message );
extern ULONG DoMethod( Object *obj, unsigned long MethodID, ... );
extern ULONG HookEntry();
#ifdef __GNUC__
ULONG dispatchGaugeGadget();
#else
static ULONG dispatchGaugeGadget(__a0 Class *cl,__a2 Object *o,__a1 Msg msg);
#endif
static ULONG renderGauge(Class *cl,struct Gadget *g, struct gpRender *msg);
void SPrintf(STRPTR buffer, STRPTR format, ...);
Class *initGaugeGadgetClass(void)
{
Class *cl;
if( cl = (Class *)MakeClass( NULL, "gadgetclass", NULL, sizeof(struct GaugeData), 0) )
{
cl->cl_Dispatcher.h_Entry = (ULONG(*)()) HookEntry;
cl->cl_Dispatcher.h_SubEntry = (ULONG(*)()) dispatchGaugeGadget;
return(cl);
}
}
BOOL freeGaugeGadgetClass( Class *cl )
{
return FreeClass(cl);
}
struct TextFont *OpenTopaz()
{
struct TextAttr topaz_font =
{
"topaz.font",
8,
0,
FPF_ROMFONT,
};
return((struct TextFont *)OpenFont( &topaz_font));
}
void SPrintf(STRPTR buffer, STRPTR format, ...)
{
struct Library *SysBase= *((void **)4L);
RawDoFmt( format, (APTR)(&format+1), (void (*)())"\x16\xc0\x4E\x75", buffer);
}
my_strlen(char s[]) /*liefert die Laenge von s */
{
int i=0;
while (s[i]!='\0')++i;
return(i);
}
struct GAU_Color dummycol={ TRUE, 0, 0, 0 };
struct GAU_Color *GetGaugePen(WORD pen){ dummycol.red=pen; return(&dummycol); }
GetGaugePenNew(struct gpRender *msg,struct GaugeData *inst,struct GAU_Color *col,ULONG number)
{
if(col->pen)
{
inst->PorC[number]=FALSE;
inst->Pens[number]=col->red;
}
else
{
inst->PorC[number]=TRUE;
inst->Pens[number]=ObtainBestPenA(msg->gpr_GInfo->gi_Screen->ViewPort.ColorMap, col->red, col->green, col->blue, 0L);
}
}
ReleasePenNew(struct gpRender *msg,struct GaugeData *inst,ULONG number)
{
/* if(inst->PorC[number])
{
ReleasePen(msg->gpr_GInfo->gi_Screen->ViewPort.ColorMap,inst->Pens[number]);
inst->PorC[number]=FALSE;
}*/
}
ULONG newGauge(Class *cl,struct Gadget *g,struct gpRender *msg,struct GaugeData *inst)
{
ULONG retval;
struct TagItem *ti;
ti = ((struct opSet *)msg)->ops_AttrList;
if(inst->textFont = (struct TextFont *)GetTagData(GAU_TextFont,OpenTopaz(),ti))
{
struct RastPort *dummy;
if(dummy=(struct RastPort *)AllocVec(sizeof(struct RastPort),0L))
{
InitRastPort(dummy);
dummy->Font=inst->textFont;
{
inst->min = GetTagData(GAU_Min, 0, ti);
inst->max = GetTagData(GAU_Max, 65535L, ti);
inst->current = GetTagData(GAU_Current,32162L, ti);
inst->base = GetTagData(GAU_Base, 16384L, ti);
inst->txtfmt = (char *)GetTagData(GAU_TextFormat, "%td", ti);
inst->txtlbl = (char *)GetTagData(GAU_Label, "Gauge", ti);
inst->labelpos = GetTagData(GAU_LabelPos,TextLength(dummy,inst->txtlbl,my_strlen(inst->txtlbl))+4, ti);
inst->Style3D = GetTagData(GAU_3D, TRUE, ti);
inst->StyleBorder = GetTagData(GAU_Border, TRUE, ti);
inst->StyleBackground = GetTagData(GAU_Background, FALSE, ti);
inst->StyleShadowLabel = GetTagData(GAU_ShadowLabel, FALSE, ti);
inst->StyleNoGauge = GetTagData(GAU_NoGauge, FALSE, ti);
inst->StyleNoFormat = GetTagData(GAU_NoFormat, FALSE, ti);
inst->StyleNoBase = GetTagData(GAU_NoBase, FALSE, ti);
inst->fmtind = GetTagData(GAU_FmtIndent, FALSE, ti);
inst->type = GetTagData(GAU_Type, GAU_Type_gauge, ti);
if(inst->type==GAU_Type_clock) inst->locale = (struct Locale *)OpenLocale(NULL);
CopyMem(GetTagData(GAU_ColLabel , GetGaugePen(2), ti), &inst->Colors[col_label],sizeof(struct GAU_Color));
CopyMem(GetTagData(GAU_ColFormat , GetGaugePen(2), ti), &inst->Colors[col_format],sizeof(struct GAU_Color));
CopyMem(GetTagData(GAU_ColBase , GetGaugePen(1), ti), &inst->Colors[col_base],sizeof(struct GAU_Color));
CopyMem(GetTagData(GAU_ColCurrent , GetGaugePen(3), ti), &inst->Colors[col_current],sizeof(struct GAU_Color));
CopyMem(GetTagData(GAU_ColNegative , GetGaugePen(1), ti), &inst->Colors[col_negative],sizeof(struct GAU_Color));
CopyMem(GetTagData(GAU_ColBrightEdg , GetGaugePen(2), ti), &inst->Colors[col_bright],sizeof(struct GAU_Color));
CopyMem(GetTagData(GAU_ColDarkEdg , GetGaugePen(1), ti), &inst->Colors[col_dark],sizeof(struct GAU_Color));
CopyMem(GetTagData(GAU_ColBackground, GetGaugePen(0), ti), &inst->Colors[col_bg],sizeof(struct GAU_Color));
inst->InitNotDone=TRUE;
retval=(ULONG)g;
}
FreeVec(dummy);
}
else { retval=0L;}
}
else { retval=0L;}
return(retval);
}
freeRPorts(struct GaugeData *inst)
{
if(inst->bg_buffer)
{
FreeBitMap(inst->bg_buffer->BitMap);
FreeVec(inst->bg_buffer);
inst->bg_buffer=0L;
}
if(inst->wk_buffer)
{
FreeBitMap(inst->wk_buffer->BitMap);
FreeVec(inst->wk_buffer);
inst->wk_buffer=0L;
}
if(inst->hs_buffer)
{
FreeBitMap(inst->hs_buffer->BitMap);
FreeVec(inst->hs_buffer);
inst->hs_buffer=0L;
}
}
ULONG disposeGauge(Class *cl,struct Gadget *g,struct gpRender *msg)
{
struct GaugeData *inst;
ULONG i;
inst=INST_DATA(cl,g);
CloseLocale(inst->locale);
/* for(i=0;i<8;i++)
{
if(inst->PorC[i]==TRUE)
{
ReleasePen(msg->gpr_GInfo->gi_Screen->ViewPort.ColorMap,inst->Pens[i]);
inst->PorC[i]=FALSE;
}
}*/
freeRPorts(inst);
}
ULONG getGauge(Class *cl,struct Gadget *g,struct gpRender *msg)
{
struct GaugeData *inst;
inst=INST_DATA(cl,g);
switch (((struct opGet *)msg)->opg_AttrID)
{
case GAU_RPBackground:
*(((struct opGet *)msg)->opg_Storage)=(ULONG)inst->bg_buffer;
break;
case GAU_Base:
*(((struct opGet *)msg)->opg_Storage)=(ULONG)inst->base;
break;
case GAU_Current:
*(((struct opGet *)msg)->opg_Storage)=(ULONG)inst->current;
break;
default:
return((ULONG)FALSE);
break;
}
return((ULONG)TRUE);
}
setGauge(Class *cl,struct Gadget *g,struct gpRender *msg)
{
struct TagItem *ti,*tstate=((struct opSet *)msg)->ops_AttrList;
struct GaugeData *inst;
struct RastPort *rp;
ULONG t_data;
inst=INST_DATA(cl,g);
while(ti=(struct TagItem *)NextTagItem(&tstate))
{
t_data=(ULONG)ti->ti_Data;
switch(ti->ti_Tag)
{
case GAU_Current:
inst->current= (ULONG)t_data;
break;
case GAU_Base:
inst->base= (ULONG)t_data;
break;
case GAU_Max:
inst->max= (ULONG)t_data;
break;
}
}
if ( FindTagItem(GA_Width, ((struct opSet *)msg)->ops_AttrList) ||
FindTagItem(GA_Height, ((struct opSet *)msg)->ops_AttrList) ||
FindTagItem(GA_Top, ((struct opSet *)msg)->ops_AttrList) ||
FindTagItem(GA_Left, ((struct opSet *)msg)->ops_AttrList) )
{
inst->InitNotDone=TRUE;
freeRPorts(inst);
}
}
UBYTE long_2_string_with_thousand(ULONG num, char output[], char point)
{
char output_private[16];
char n = 0;
char n_1 = 0;
SPrintf(output_private,"%12ld",num);
while(output_private[n]==0x20)n++;
for(;(output_private[n]!=0)&(output_private[n]!=0x20);n++)
{
output[n_1++]=output_private[n];
if((n==2)||(n==5)||(n==8)) output[n_1++]=(char)point;
}
output[n_1]=0;
return(n_1);
}
char *formattext(ULONG current, ULONG base, ULONG max, char format[])
{
int i=0,
j=0;
char temp_str_1[64];
static char temp_str[256];
while(format[i]!=0)
{
if(format[i]=='%')
{
ULONG dummy=0;
UBYTE dummy_2=0,
dummy_1=0,
dummy_3=0;
i++;
if(format[i]=='t'){dummy_2=1;i++;}
if(format[i]=='T'){dummy_2=4;i++;}
if(format[i]=='k'){dummy_1=1;i++;}
if(format[i]=='m'){dummy_1=2;i++;}
if(format[i]=='o'){dummy_3=1;i++;}
if(format[i]=='%'){dummy_2=3;i++;}
switch(format[i])
{
case 'd':
dummy=current; i++;
break;
case 'b':
dummy=base; i++;
break;
case 'a':
dummy=max; i++;
break;
case 'p':
dummy_2=2; dummy=current; i++;
break;
}
if(dummy_3==1)dummy=max-dummy;
if(dummy_1==1)dummy=dummy>>10;
if(dummy_1==2)dummy=dummy>>20;
switch(dummy_2)
{
case 4:
dummy_2=long_2_string_with_thousand(dummy,&temp_str_1[0],'.');
for(dummy_1=0;dummy_1<dummy_2;dummy_1++) temp_str[j++]=temp_str_1[dummy_1];
break;
case 1:
dummy_2=long_2_string_with_thousand(dummy,&temp_str_1[0],',');
for(dummy_1=0;dummy_1<dummy_2;dummy_1++) temp_str[j++]=temp_str_1[dummy_1];
break;
case 2:
dummy_2=0;
SPrintf(&temp_str_1[0],"%ld",(((dummy>>8)*100)/((max>>8)+1)) );
while ((temp_str_1[dummy_2] != 0)&(dummy_2<64)) temp_str[j++]=temp_str_1[dummy_2++];
break;
case 0:
dummy_2=0;
SPrintf(&temp_str_1[0],"%ld",dummy);
while ((temp_str_1[dummy_2] != 0)&(dummy_2<64)) temp_str[j++]=temp_str_1[dummy_2++];
break;
case 3:
temp_str[j++]='%';
break;
}
}
else temp_str[j++]=format[i++];
}
temp_str[j++]=0;
return(temp_str);
}
void draw_border_new( struct RastPort *rp,ULONG x, ULONG y, ULONG width, ULONG height, int b_col1, int b_col2 )
{
width--;height--;
SetAPen(rp,b_col2);
RectFill(rp,x+width,y+1,x+width,y+height);
RectFill(rp,x,y+height,x+width,y+height);
SetAPen(rp,b_col1);
RectFill(rp,x,y,x,y+height-1);
RectFill(rp,x,y,x+width-1,y);
}
my_RectFill(struct RastPort *rp,WORD x,WORD y,WORD width,WORD height)
{
if(((x+width-1)>0)&&((y+height-1)>0)) RectFill(rp,x,y,x+width-1,y+height-1);
}
putChar_hook(struct Hook *hook,struct Locale *locale,ULONG thechar)
{
struct GaugeData *data;
geta4(); data=(struct GaugeData *)hook->h_Data;
data->clocktxt[data->clockpos++]=(UBYTE)(thechar);
}
struct Hook putCharHook = { { 0,0 },(void *)HookEntry,(void *)putChar_hook, NULL };
my_Blit(struct RastPort *src, WORD topx, WORD topy, struct RastPort *dest, WORD dtopx, WORD dtopy, WORD width, WORD height)
{
if((width>0)&&(height>0)&&(width<(dest->BitMap->BytesPerRow<<8))&&(height<dest->BitMap->Rows))
{
ClipBlit(src,topx,topy,dest,dtopx,dtopy,width,height,0xC0);
}
}
ULONG renderGauge(Class *cl,struct Gadget *g,struct gpRender *msg)
{
struct RastPort *rp;
ULONG retval;
struct BitMap *work_bm;
struct RastPort *wk_rp,*bg_rp,*hs_rp;
struct GaugeData *inst;
struct DateStamp d_stamp;
WORD text_x,w,h;
WORD x1,x2,g_x,g_y,g_size,g_height,t_length;
char *fmt;
LONG max;
inst=INST_DATA(cl,g);
if(msg->MethodID == GM_RENDER)
rp=msg->gpr_RPort;
else
rp=(struct RastPort *) ObtainGIRPort(msg->gpr_GInfo);
if(rp)
{
retval=TRUE;
if(inst->InitNotDone)
{
if(work_bm=(struct BitMap *)AllocBitMap(g->Width,g->Height+2,rp->BitMap->Depth,BMF_CLEAR,rp->BitMap))
{
if(inst->bg_buffer=(struct RastPort *)AllocVec(sizeof(struct RastPort)+8,MEMF_CLEAR|MEMF_PUBLIC))
{
InitRastPort(inst->bg_buffer);
inst->bg_buffer->BitMap=work_bm;
my_Blit(rp,g->LeftEdge,g->TopEdge,inst->bg_buffer,0,0,g->Width,g->Height);
}
else
{
FreeBitMap(work_bm);
retval=0L;
goto fail;
}
}
else { retval=0L; goto fail; }
if(work_bm=(struct BitMap *)AllocBitMap(g->Width,g->Height+2,rp->BitMap->Depth,BMF_CLEAR,inst->bg_buffer->BitMap))
{
if(inst->wk_buffer=(struct RastPort *)AllocVec(sizeof(struct RastPort)+8,MEMF_CLEAR|MEMF_PUBLIC))
{
InitRastPort(inst->wk_buffer);
inst->wk_buffer->BitMap=work_bm;
inst->text_y=((g->Height-((inst->textFont->tf_Baseline+inst->textFont->tf_YSize)>>1))>>1);
if(inst->textFont->tf_Baseline<inst->textFont->tf_YSize)
{
inst->text_y+=inst->textFont->tf_Baseline-1;
if(inst->text_y<inst->textFont->tf_Baseline)inst->text_y=inst->textFont->tf_Baseline;
}
else
{
inst->text_y+=inst->textFont->tf_YSize-1;
if(inst->text_y<inst->textFont->tf_YSize)inst->text_y=inst->textFont->tf_YSize;
}
SetDrMd(inst->wk_buffer,JAM1);
SetFont(inst->wk_buffer,inst->textFont);
}
else
{
FreeBitMap(work_bm);
retval=0L;
goto fail;
}
}
else { retval=0L; goto fail; }
for(w=0;w<GAU_UsedColors;w++)GetGaugePenNew(msg,inst,&inst->Colors[w],w);
if(inst->type==GAU_Type_histmeter)
{
if(work_bm=(struct BitMap *)AllocBitMap(g->Width,g->Height+2,rp->BitMap->Depth,BMF_CLEAR,inst->wk_buffer->BitMap))
{
if(inst->hs_buffer=(struct RastPort *)AllocVec(sizeof(struct RastPort)+8,MEMF_CLEAR|MEMF_PUBLIC))
{
inst->histpos=0;
InitRastPort(inst->hs_buffer);
inst->hs_buffer->BitMap=work_bm;
SetAPen(inst->hs_buffer,inst->Pens[col_bg]);
if(inst->StyleBackground)
{
my_Blit(inst->bg_buffer,0,0,inst->hs_buffer,0,0,g->Width,g->Height);
}
else
{
my_RectFill(inst->hs_buffer,0,0,g->Width,g->Height);
}
}
else
{
FreeBitMap(work_bm);
retval=0L;
goto fail;
}
}
else { retval=0L; goto fail; }
}
inst->old_cur=-1;
inst->old_bas=-1;
inst->InitNotDone=FALSE;
}
w=g->Width-1;
h=g->Height-1;
wk_rp=inst->wk_buffer;
bg_rp=inst->bg_buffer;
hs_rp=inst->hs_buffer;
max=inst->max>>8;
switch (inst->type)
{
case GAU_Type_gauge:
if((inst->current!=inst->old_cur)||(inst->base!=inst->old_bas))
{
inst->old_cur=inst->current;
inst->old_bas=inst->base;
my_Blit(bg_rp,0,0,wk_rp,0,0,g->Width,g->Height);
if(inst->StyleBorder)draw_border_new(wk_rp,inst->labelpos,0,g->Width-inst->labelpos,g->Height,inst->Pens[col_dark],inst->Pens[col_bright]);
if(inst->StyleShadowLabel)
{
SetAPen(wk_rp,inst->Pens[col_dark]);
Move(wk_rp,1,inst->text_y+1);
Text(wk_rp,inst->txtlbl,my_strlen(inst->txtlbl));
}
SetAPen(wk_rp,inst->Pens[col_label]);
Move(wk_rp,0,inst->text_y);
Text(wk_rp,inst->txtlbl,my_strlen(inst->txtlbl));
if(!inst->StyleNoGauge)
{
g_x=1+inst->labelpos;
g_y=1;
g_size=w-inst->labelpos-1;
g_height=h-1;
x1=g_size-(WORD)(((inst->base>>8) *g_size)/((max)==0 ? 1 : (max)));
x2=g_size-(WORD)(((inst->current>>8)*g_size)/((max)==0 ? 1 : (max)));
if(!inst->StyleNoBase)
{
if(x1<x2) /* the most used... */
{
SetAPen(wk_rp,inst->Pens[col_base]);
my_RectFill(wk_rp,g_x,g_y,x1,g_height);
SetAPen(wk_rp,inst->Pens[col_current]);
my_RectFill(wk_rp,g_x+x1,g_y,x2-x1,g_height);
if(!inst->StyleBackground)
{
SetAPen(wk_rp,inst->Pens[col_bg]);
my_RectFill(wk_rp,g_x+x2,g_y,g_size-x2,g_height);
}
if(inst->Style3D)
{
if(x1>1) draw_border_new(wk_rp,g_x,g_y,x1,g_height,inst->Pens[col_bright],inst->Pens[col_dark]);
if(x2-x1>1)draw_border_new(wk_rp,g_x+x1,g_y,x2-x1,g_height,inst->Pens[col_bright],inst->Pens[col_dark]);
}
}
else
{
if(x1>x2)
{
SetAPen(wk_rp,inst->Pens[col_base]);
my_RectFill(wk_rp,g_x,g_y,x2,g_height);
SetAPen(wk_rp,inst->Pens[col_negative]);
my_RectFill(wk_rp,g_x+x2,g_y,x1-x2,g_height);
if(!inst->StyleBackground)
{
SetAPen(wk_rp,inst->Pens[col_bg]);
my_RectFill(wk_rp,g_x+x1,g_y,g_size-x1,g_height);
}
if(inst->Style3D)
{
if(x2>1) draw_border_new(wk_rp,g_x,g_y,x2,g_height,inst->Pens[col_bright],inst->Pens[col_dark]);
if(x1-x2>1)draw_border_new(wk_rp,g_x+x2,g_y,x1-x2,g_height,inst->Pens[col_bright],inst->Pens[col_dark]);
}
}
else
{
SetAPen(wk_rp,inst->Pens[col_base]);
my_RectFill(wk_rp,g_x,g_y,x1,g_height);
if(!inst->StyleBackground)
{
SetAPen(wk_rp,inst->Pens[col_bg]);
my_RectFill(wk_rp,g_x+x1,g_y,g_size-x1,g_height);
}
if(inst->Style3D) if(x1>1)draw_border_new(wk_rp,g_x,g_y,x1,g_height,inst->Pens[col_bright],inst->Pens[col_dark]);
}
}
}
else
{
SetAPen(wk_rp,inst->Pens[col_current]);
my_RectFill(wk_rp,g_x,g_y,x2,g_height);
if(!inst->StyleBackground)
{
SetAPen(wk_rp,inst->Pens[col_bg]);
my_RectFill(wk_rp,g_x+x2,g_y,g_size-x2,g_height);
}
if(inst->Style3D) draw_border_new(wk_rp,g_x,g_y,x2,g_height,inst->Pens[col_bright],inst->Pens[col_dark]);
}
}
if(!inst->StyleNoFormat)
{
fmt=formattext(inst->current,inst->base,inst->max,inst->txtfmt);
SetAPen(wk_rp,inst->Pens[col_format]);
t_length=TextLength(wk_rp,fmt,my_strlen(fmt));
if(t_length<(w-inst->labelpos))
{
switch(inst->fmtind)
{
case ind_centered:
text_x=g_x+((g_size-t_length)>>1);
break;
case ind_left:
text_x=g_x+2;
break;
case ind_right:
text_x=w-t_length-2;
break;
}
Move(wk_rp,text_x,inst->text_y);
Text(wk_rp,fmt,my_strlen(fmt));
}
}
my_Blit(wk_rp,0,0,rp,g->LeftEdge,g->TopEdge,g->Width,g->Height);
}
break;
case GAU_Type_histmeter:
w++;
h++;
g_size=h-3;
if(!inst->StyleNoGauge)
{
x1=(WORD)(((inst->base >>8)*g_size)/((max)==0 ? 1 : (max)));
x2=(WORD)(((inst->current>>8)*g_size)/((max)==0 ? 1 : (max)));
inst->histpos++;
if(inst->histpos>w-3)
{
WORD dummy;
dummy=w-(w>>1)-2;
SetAPen(hs_rp,inst->Pens[col_bg]);
my_Blit(hs_rp,w>>1,0,hs_rp,0,0,dummy,h);
if(inst->StyleBackground)
{
my_Blit(inst->bg_buffer,dummy,0,inst->hs_buffer,dummy,0,w-dummy,h);
}
else
{
RectFill(hs_rp,dummy,0,w,h);
}
inst->histpos=dummy;
}
if(!inst->StyleNoBase)
{
SetAPen(hs_rp,inst->Pens[col_base]);
if(x1>x2)
{
RectFill(hs_rp,inst->histpos,x1+2,inst->histpos,g_size+1);
SetAPen(hs_rp,inst->Pens[col_current]);
RectFill(hs_rp,inst->histpos,x2+2,inst->histpos,x1+1);
}
if(x1<x2)
{
RectFill(hs_rp,inst->histpos,x1+2,inst->histpos,g_size+1);
SetAPen(hs_rp,inst->Pens[col_negative]);
RectFill(hs_rp,inst->histpos,x1+2,inst->histpos,x2+1);
}
if(x1==x2)
{
RectFill(hs_rp,inst->histpos,x1+2,inst->histpos,g_size+1);
}
}
else
{
SetAPen(hs_rp,inst->Pens[col_current]);
RectFill(hs_rp,inst->histpos,x2+2,inst->histpos,g_size+1);
}
my_Blit(hs_rp,0,0,wk_rp,0,0,w,h);
}
if(inst->StyleBorder)draw_border_new(wk_rp,0,0,g->Width,g->Height,inst->Pens[col_dark],inst->Pens[col_bright]);
if(!inst->StyleNoFormat)
{
fmt=formattext(inst->current,inst->base,inst->max,inst->txtfmt);
SetAPen(wk_rp,inst->Pens[col_format]);
t_length=TextLength(wk_rp,fmt,my_strlen(fmt));
if(t_length<w)
{
switch(inst->fmtind)
{
case ind_centered:
text_x=((w-t_length)>>1);
break;
case ind_left:
text_x=2;
break;
case ind_right:
text_x=w-t_length-2;
break;
}
Move(wk_rp,text_x,h-3);
Text(wk_rp,fmt,my_strlen(fmt));
}
}
my_Blit(wk_rp,0,0,rp,g->LeftEdge,g->TopEdge,g->Width,g->Height);
break;
case GAU_Type_clock:
DateStamp(&d_stamp);
inst->clockpos=0; putCharHook.h_Data=inst; FormatDate(inst->locale,inst->txtfmt,&d_stamp,&putCharHook);
if((t_length=TextLength(wk_rp,&inst->clocktxt[0],my_strlen(&inst->clocktxt[0])))<w)
{
switch(inst->fmtind)
{
case ind_centered:
text_x=(w-t_length)>>1;
break;
case ind_left:
text_x=0;
break;
case ind_right:
text_x=w-t_length-1;
break;
}
my_Blit(bg_rp,text_x,0,wk_rp,text_x,0,t_length,g->Height);
if(inst->StyleShadowLabel)
{
SetAPen(wk_rp,inst->Pens[col_dark]);
Move(wk_rp,text_x+1,inst->text_y+1);
Text(wk_rp,&inst->clocktxt[0],my_strlen(&inst->clocktxt[0]));
}
SetAPen(wk_rp,inst->Pens[col_format]);
Move(wk_rp,text_x,inst->text_y);
Text(wk_rp,&inst->clocktxt[0],my_strlen(&inst->clocktxt[0]));
}
my_Blit(wk_rp,text_x,0,rp,g->LeftEdge+text_x,g->TopEdge,t_length,g->Height);
break;
}
if(msg->MethodID !=GM_RENDER) ReleaseGIRPort(rp);
}
else retval=FALSE;
fail:
return(retval);
}
#ifdef __GNUC__
ULONG dispatchGaugeGadget(Class *cl,Object *o, Msg msg)
#else
__geta4 ULONG dispatchGaugeGadget(__a0 Class *cl,__a2 Object *o,__a1 Msg msg)
#endif
{
struct Gadget *g= (struct Gadget *)o;
struct GaugeData *inst;
ULONG retval;
Object *object;
#ifdef __GNUC__
geta4();
#endif
retval=DoSuperMethodA(cl,o,msg);
switch( msg->MethodID )
{
case OM_SET:
setGauge(cl,(struct Gadget *)o,(struct gpRender *)msg);
break;
case GM_RENDER:
retval=renderGauge(cl,(struct Gadget *)o,(struct gpRender *)msg);
break;
case OM_NEW:
if(object = (Object *)DoSuperMethodA(cl, o, msg) )
{
inst = INST_DATA(cl, object);
retval=newGauge(cl,(struct Gadget *)object,(struct gpRender *)msg,inst);
}
break;
case OM_GET:
retval=getGauge(cl,(struct Gadget *)o,(struct gpRender *)msg);
break;
case OM_DISPOSE:
disposeGauge(cl,g,(struct gpRender *)msg);
break;
default:
break;
}
return(retval);
}